//
//  SHTimerViewController.m
//  SDemo
//
//  Created by gg on 2018/10/23.
//  Copyright © 2018 gg. All rights reserved.
//

#import "SHTimerViewController.h"
#import "NSTimer+SHBlockSupport.h"

@interface SHTimerViewController ()

@property (nonatomic,strong)NSTimer *timer;


@end

@implementation SHTimerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"定时器";
    self.view.backgroundColor = [UIColor whiteColor];
    /**
     知识点  https://www.jianshu.com/p/9e7e8c806ea3
    1， 它会被添加到runloop，否则不会运行，当然添加的runloop不存在也不会运行；
    2， 还要指定添加到的runloop的哪个模式，而且还可以指定添加到runloop的多个模式，模式不对也是不会运行的
    3， runloop会对timer有强引用，timer会对目标对象进行强引用(是否隐约的感觉到坑了。。。)
    4， timer的执行时间并不准确，系统繁忙的话，还会被跳过去
    5， invalidate调用后，timer停止运行后，就一定能从runloop中消除吗，资源？？？？
     
     由于NSTimer被加到runloop的时候会被runloop强引用，故如果使用scheduledTimerWithTimeInterval构造函数时，我们可以在viewcontroller使用weak引用NSTimer
     */
    
    
    /**
     scheduledTimerWithTimeInterval 方法创建的timer 不用手动加入runloop
     timerWithTimeInterval 方法需要调用 addTimer:forMode:
     */
    
    /**
     timer 强引用，原因：创建定时器的时候，由于目标对象是self，所以要保留此实例。然而，因为定时器是用实例变量存放的，所以实例也保留了定时器，这就造成了循环引用
     
     循环引用的解决方法：timer扩展方法，将要执行的操作，就是selector(...)，以block的形式传入userinfo中，以此打破循环。
     
     */

    
    //[self creatSubThead];
    
    [self createTimer];
    
    __weak typeof(self) weakSelf = self;
    NSTimer *timer = [NSTimer sh_scheduledTimerWithTimeInterval:1.0 repeats:YES handle:^{
        
        [weakSelf timebergein];
    }];
    
    self.timer = timer;
    
}

-(void)createTimer {
   
    NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timebergein) userInfo:nil repeats:YES];
    self.timer = timer1;
    
}

-(void)timebergein{
    NSLog(@"start time");
}




//MARK: 子线程中开启一个定时器
-(void)creatSubThead {
    NSThread *thead = [[NSThread alloc] initWithTarget:self selector:@selector(creatthred) object:nil];
    [thead start];
}

-(void)creatthred {
    @autoreleasepool {
         [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(newBegin) userInfo:nil repeats:YES];
        //子线程runloop 需要手动开启, 否则定时器不工作
        [[NSRunLoop currentRunLoop] run];
        
    }
}

-(void)newBegin {
    NSLog(@"thread : %@,go go go",[NSThread currentThread]);
}


-(void)dealloc {
    [self.timer invalidate];
    self.timer = nil;
}


@end
